//package autoFile.core;
//
//import autoFile.annotation.AutoFile;
//import com.google.common.base.CaseFormat;
//import org.springframework.context.support.ClassPathXmlApplicationContext;
//import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
//
//import java.io.*;
//import java.lang.reflect.Method;
//import java.util.Arrays;
//import java.util.Map;
//
///**
// * Created by IntelliJ IDEA.
// * User: liuliwei
// * Date: 2017-08-16
// * Time: 上午9:45
// * Description: ${description}
// */
//public class Core {
//
//    private static FileWriter dbConstantWriter;
//    private static FileWriter gongRpcConstantsWriter;
//
//
//    static {
//        try {
//            dbConstantWriter = new FileWriter("/Users/liuliwei/autoFile/GongDbConstants.java", true);
//            gongRpcConstantsWriter = new FileWriter("/Users/liuliwei/autoFile/GongRpcConstants.java", true);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
//                new String[]{"classpath*:dbs/application-context-dbs*.xml"});
//        Map<String, Object> beans = ctx.getBeansWithAnnotation(AutoFile.class);
////        deleteFile();
//        for (Object o : beans.values()) {
//            String className = o.getClass().getName();
//            int $Index = o.getClass().getName().indexOf("$");
//            Class clazz = Class.forName(className.substring(0, $Index));
//            createUserCommandFile(clazz);
//        }
//        dbConstantWriter.close();
//        gongRpcConstantsWriter.close();
//    }
//
////    public static void main(String[] args) throws IOException, InterruptedException {
//////        System.out.println(Runtime.getRuntime().exec("rm /Users/liuliwei/autoFile/* ").getErrorStream());
////        System.out.println(Runtime.getRuntime().exec("cleanautofile").waitFor());
////    }
//
//    /**
//     * 清空文件夹
//     *
//     * @throws IOException
//     */
//    private static void deleteFile() throws IOException {
//        Runtime.getRuntime().exec("cleanautofile");
//    }
//
//    /**
//     * 创建 userCommand子类
//     *
//     * @param clazz
//     */
//    private static void createUserCommandFile(Class clazz) throws IOException {
//        String userCommandTemplate = getUserCommandTemplate();
//        String userCommandMethodTemplate = getUserCommandMethodTemplate();
//        String className = clazz.getSimpleName(); //类名称
//        String classNameSmall = CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL).convert(className); //类名称小写
//        String targetClassName = className + "Proxy";//生成文件名称
//        String classNameWithService = new String(className); //类名称后面有Service
//        String classNameWithServiceSmall = CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL).convert(classNameWithService); //类名称小写后面有Service
//
//        if (className.contains("Service")) {
//            className = className.replaceFirst("Service", "");
//            classNameSmall = classNameSmall.replaceFirst("Service", "");
//        }
//        String userCommandMethodTemplates = "";
//        for (Method method : clazz.getDeclaredMethods()) {
//            String parameterTypeAndName = getParameterTypeAndName(method);
//            String parameterNames = getParameterNames(method);
//            String dbConstant = createDbConstants(className, method, dbConstantWriter);
//            String classNameT = userCommandMethodTemplate.replace("className", classNameWithServiceSmall);
//            String methodName = classNameT.replace("methodName", method.getName());
//            String parameters = methodName.replace("parameters", parameterTypeAndName);
//            String parameterNames1 = parameters.replace("parameterNames", parameterNames);
//            String result = parameterNames1.replace("dbConstant", dbConstant);
//            result += "\t";
//            userCommandMethodTemplates += result;
//            createGongRpcConstants(className, method, gongRpcConstantsWriter);
//        }
//        String replaceContent = userCommandTemplate.replace("#", userCommandMethodTemplates);
//        String replace$ = replaceContent.replace("$", targetClassName);
//        String ClassName = replace$.replace("ClassName", classNameWithService);
//        String result = ClassName.replace("classNa,e", classNameWithServiceSmall);
//        FileWriter userCommandProxyWriter = new FileWriter("/Users/liuliwei/autoFile/" + targetClassName + ".java", true);
//        userCommandProxyWriter.write(result);
//        userCommandProxyWriter.close();
//    }
//
//
//    private static String getParameterTypeAndName(Method method) {
//        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
//        Class<?>[] parameterTypes = method.getParameterTypes();
//        String[] parameterNames = u.getParameterNames(method);
//        String ret = "";
//        for (int i = 0; i < parameterTypes.length; i++) {
//            ret += convertParameterType(parameterTypes[i]) + " " + parameterNames[i];
//            if (i < ((parameterTypes.length) - 1)) {
//                ret += ",";
//            }
//        }
//        return ret;
//    }
//
//    private static String convertParameterType(Class<?> parameterType) {
//        String pa = parameterType.getName();
//        if (pa.contains(".")) {
//            pa = pa.substring(pa.lastIndexOf(".") + 1);
//        }
//        return pa;
//    }
//
//    private static String getParameterNames(Method method) {
//        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
//        String[] parameterNames = u.getParameterNames(method);
//        return Arrays.toString(parameterNames).substring(1, Arrays.toString(parameterNames).length() - 1);
//    }
//
//
//    /**
//     * 得到dbs模板
//     *
//     * @return
//     */
//    private static String getUserCommandTemplate() throws IOException {
//        return getTemplateByFullPath("/Users/liuliwei/autoFile/template/userCommandTemplate");
//    }
//
//    /**
//     * 得到  dbs  方法模板
//     *
//     * @return
//     * @throws IOException
//     */
//    private static String getUserCommandMethodTemplate() throws IOException {
//        return getTemplateByFullPath("/Users/liuliwei/autoFile/template/userCommandMethodTemplate");
//    }
//
//    /**
//     * 方法主体
//     *
//     * @param path
//     * @return
//     * @throws IOException
//     */
//    private static String getTemplateByFullPath(String path) throws IOException {
//        FileReader fileReader = new FileReader(path);
//        BufferedReader bufferedReader = new BufferedReader(fileReader);
//        String ret = "";
//        String temp;
//        while ((temp = bufferedReader.readLine()) != null) {
//            ret += temp;
//        }
//        return ret;
//    }
//
//    /**
//     * gas
//     * proxy模板
//     *
//     * @return
//     * @throws IOException
//     */
//    private static String getUserProxyTemplate() throws IOException {
//        return getTemplateByFullPath("/Users/liuliwei/autoFile/template/userProxyTemplate");
//    }
//
//    /**
//     * 得到 gas  proxy 方法模板
//     *
//     * @return
//     * @throws IOException
//     */
//    private static String getUserProxyMethodTemplate() throws IOException {
//        return getTemplateByFullPath("/Users/liuliwei/autoFile/template/userProxyMethodTemplate");
//    }
//
//    /**
//     * gas
//     * service模板
//     *
//     * @return
//     * @throws IOException
//     */
//    private static String getUserServiceTemplate() throws IOException {
//        return getTemplateByFullPath("/Users/liuliwei/autoFile/template/userServiceTemplate");
//    }
//
//    /**
//     * 得到gas Service 方法模板
//     *
//     * @return
//     * @throws IOException
//     */
//    private static String getUserServiceMethodTemplate() throws IOException {
//        return getTemplateByFullPath("/Users/liuliwei/autoFile/template/userServiceTemplate");
//    }
//
//    /**
//     * 创建DbConstants
//     */
//    private static String createDbConstants(String simpleName, Method method, FileWriter fileWriter) throws IOException {
//        simpleName = CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL).convert(simpleName);
//        String methodName = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_CAMEL).convert(method.getName());
//        String name = simpleName + methodName;
//        String returnString = "GongDbConstants." + CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_UNDERSCORE).convert(name);
//        String pre = "public static final String ";
//        String dbConstant = pre + CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_UNDERSCORE).convert(name) + "= \"ar." + name + "\";\n";
//        fileWriter.write(dbConstant);
//        return returnString;
//    }
//
//    /**
//     * @param simpleName
//     * @param method
//     * @param fileWriter
//     * @return
//     * @throws IOException
//     */
//    private static String createGongRpcConstants(String simpleName, Method method, FileWriter fileWriter) throws IOException {
//        simpleName = CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL).convert(simpleName);
//        String methodName = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_CAMEL).convert(method.getName());
//        String name = simpleName + methodName;
//        String pre = "public static final String ";
//        String content = "REQ_" + CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_UNDERSCORE).convert(name);
//        String suf = " = \"u." + name + "\";";
//        String returnString = "GongRpcConstants" + content;
//        String gongRpcConstant = pre + content + suf + "\n";
//        fileWriter.write(gongRpcConstant);
//        return returnString;
//    }
//
//
//}
